//+------------------------------------------------------------------+
//|                                                        gjm顶底.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_chart_window


#property indicator_chart_window

#property indicator_buffers 6

#property indicator_color1 Blue

#property indicator_color2 Yellow

#property indicator_color3 RoyalBlue

#property indicator_color4 Red

#property indicator_color5 RoyalBlue

#property indicator_color6 Red



extern int    布周期 = 20;

extern int    布偏差 = 1;

extern double 资金风险系数 = 1.00;    // Offset Factor

extern int    显示信号样式 = 2;       // Display signals mode: 1-Signals & Stops; 0-only Stops; 2-only Signals;

extern int    显示样线 = 1;           // Display line mode: 0-no, 1-yes  

extern int    计算棒数 = 2000;

extern bool   使用报警 = false;



double 涨趋势箭[];

double 跌趋势箭[];

double 涨信号箭[];

double 跌信号箭[];

double 蓝涨线[];

double 红跌线[];

bool   已报涨= false;

bool   已报跌= false;



//----------------------------------------+



int init()

{

string 简称;



SetIndexBuffer(0, 涨趋势箭);

SetIndexBuffer(1, 跌趋势箭);

SetIndexBuffer(2, 涨信号箭);

SetIndexBuffer(3, 跌信号箭);

SetIndexBuffer(4, 蓝涨线);

SetIndexBuffer(5, 红跌线);

SetIndexStyle(0, DRAW_ARROW, 0, 1);

SetIndexStyle(1, DRAW_ARROW, 0, 1);

SetIndexStyle(2, DRAW_ARROW, 0, 1);

SetIndexStyle(3, DRAW_ARROW, 0, 1);

SetIndexStyle(4, DRAW_LINE);

SetIndexStyle(5, DRAW_LINE);

SetIndexArrow(0, 159);

SetIndexArrow(1, 159);

SetIndexArrow(2, 233);

SetIndexArrow(3, 234);

IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS));



简称= "BBands Stop("+布周期+", "+布偏差+")";

IndicatorShortName(简称);

SetIndexLabel(0, "UpTrend Stop");

SetIndexLabel(1, "DownTrend Stop");

SetIndexLabel(2, "UpTrend 信号");

SetIndexLabel(3, "DownTrend 信号");

SetIndexLabel(4, "UpTrend 线");

SetIndexLabel(5, "DownTrend 线");



SetIndexDrawBegin(0, 布周期);

SetIndexDrawBegin(1, 布周期);

SetIndexDrawBegin(2, 布周期);

SetIndexDrawBegin(3, 布周期);

SetIndexDrawBegin(4, 布周期);

SetIndexDrawBegin(5, 布周期);



return(0);

}



//----------------------------------------+



int start()

{

int    i, 趋势;

double 布上轨[25000], 布下轨[25000], 布外上轨[25000], 布外下轨[25000];



for(i=计算棒数; i>=0; i--){

涨趋势箭[i]= 0;

跌趋势箭[i]= 0;

涨信号箭[i]= 0;

跌信号箭[i]= 0;

蓝涨线[i]= EMPTY_VALUE;

红跌线[i]= EMPTY_VALUE;

}



for(i=计算棒数-布周期-1; i>=0; i--){

//--指标    

布上轨[i]= iBands(NULL, 0, 布周期, 布偏差, 0, PRICE_CLOSE, MODE_UPPER, i);

布下轨[i]= iBands(NULL, 0, 布周期, 布偏差, 0, PRICE_CLOSE, MODE_LOWER, i);



//--价格所在趋势

if(Close[i]>布上轨[i+1])

趋势= 1; 

if(Close[i]<布下轨[i+1])



趋势= -1;



//--趋势为上时，下轨只允上移

if(趋势>0 && 布下轨[i]<布下轨[i+1])

布下轨[i]= 布下轨[i+1];

//--

if(趋势<0 && 布上轨[i]>布上轨[i+1])

布上轨[i]= 布上轨[i+1];



//--外轨

布外上轨[i]= 布上轨[i]+0.5*(资金风险系数-1)*(布上轨[i]-布下轨[i]);

布外下轨[i]= 布下轨[i]-0.5*(资金风险系数-1)*(布上轨[i]-布下轨[i]);



//--趋势为上时，外下轨同样只允上移

if(趋势>0 && 布外下轨[i]<布外下轨[i+1])

布外下轨[i]= 布外下轨[i+1];

//--

if(趋势<0 && 布外上轨[i]>布外上轨[i+1])

布外上轨[i]= 布外上轨[i+1];



//--趋势向上时

if(趋势>0){

//--前一涨趋箭为-1时

if(显示信号样式>0 && 涨趋势箭[i+1]==-1.0){

涨信号箭[i]= 布外下轨[i];

涨趋势箭[i]= 布外下轨[i];

//--显示线

if(显示样线>0)

蓝涨线[i]= 布外下轨[i];

//--报警

if(使用报警==true && i==0 && 已报涨==false){

Alert("BBands going Up on ", Symbol(), "-", Period());

已报涨= true;

已报跌= false;

}

}

//--

else{

涨趋势箭[i]= 布外下轨[i];

if(显示样线>0)

蓝涨线[i]= 布外下轨[i];

涨信号箭[i]= -1;

}



if(显示信号样式==2)

涨趋势箭[i]= 0;   



跌信号箭[i]= -1;

跌趋势箭[i]= -1.0;



红跌线[i]= EMPTY_VALUE;

}



//--趋势向下时

if(趋势<0){

if(显示信号样式>0 && 跌趋势箭[i+1]==-1.0){

跌信号箭[i]= 布外上轨[i];

跌趋势箭[i]= 布外上轨[i];

if(显示样线>0)

红跌线[i]= 布外上轨[i];

if(使用报警==true && i==0 && 已报跌==false){

Alert("BBands going Down on ", Symbol(), "-", Period());

已报跌= true;

已报涨= false;

}

}

else{

跌趋势箭[i]= 布外上轨[i];

if(显示样线>0)

红跌线[i]= 布外上轨[i];

跌信号箭[i]= -1;

}

if(显示信号样式==2)

跌趋势箭[i]= 0;    

涨信号箭[i]= -1;

涨趋势箭[i]= -1.0;

蓝涨线[i]= EMPTY_VALUE;

}    

}

return(0);      

}